package gui;

import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Cursor;
import javax.swing.ImageIcon;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.JRadioButton;
import java.awt.Dimension;
import javax.swing.ButtonGroup;
import java.awt.Font;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

@SuppressWarnings("serial")
public class PanelInicio extends JPanel {

	public static enum modo {
		FACIL, DIFICIL
	}

	/**
	 * Declara publico los botones accesibles desde el control de eventos
	 * central.
	 */
	public JButton btnComenzar;

	private JTextField txtNombre;
	private final ButtonGroup buttonGroup = new ButtonGroup();
	private JRadioButton rdbtnFacil;
	private JRadioButton rdbtnDificil;
	private JTextPane txtpnMensaje;
	private PanelImagen panelBurbuja;

	/**
	 * Construye el panel donde se ingresa el nombre del jugador y se selecciona
	 * el modo de juego.
	 */
	public PanelInicio() {
		setOpaque(false);
		setPreferredSize(new Dimension(822, 520));
		setBorder(null);
		setForeground(Color.BLACK);
		setBackground(UIManager.getColor("Button.background"));
		setLayout(null);

		crearBurbuja();
		crearIngresarDatos();

		eventosLocales();
	}

	private void crearBurbuja() {

		ImageIcon imgBurbuja = new ImageIcon("img/paneles/burbujaMensajes.png");

		panelBurbuja = new PanelImagen(imgBurbuja.getImage());
		panelBurbuja.setVerifyInputWhenFocusTarget(false);
		panelBurbuja.setRequestFocusEnabled(false);
		panelBurbuja.setFocusable(false);
		panelBurbuja.setFocusTraversalKeysEnabled(false);
		panelBurbuja.setPreferredSize(new Dimension(300, 162));
		panelBurbuja.setBounds(233, 12, 300, 162);
		add(panelBurbuja);
		panelBurbuja.setLayout(null);

		JTextPane txtpnMsgBurbuja = new JTextPane();
		txtpnMsgBurbuja.setFocusCycleRoot(false);
		txtpnMsgBurbuja.setFocusTraversalKeysEnabled(false);
		txtpnMsgBurbuja.setFocusable(false);
		txtpnMsgBurbuja.setRequestFocusEnabled(false);
		txtpnMsgBurbuja.setVerifyInputWhenFocusTarget(false);
		txtpnMsgBurbuja.setAutoscrolls(false);
		txtpnMsgBurbuja.setEditable(false);
		txtpnMsgBurbuja.setFont(new Font("Dialog", Font.BOLD, 14));
		txtpnMsgBurbuja.setOpaque(false);

		// Centrado de texto
		StyledDocument doc = txtpnMsgBurbuja.getStyledDocument();
		SimpleAttributeSet center = new SimpleAttributeSet();
		StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
		doc.setParagraphAttributes(0, doc.getLength(), center, false);

		txtpnMsgBurbuja
				.setText("Por algunas donut adivinaré todos los animales que imagines.");
		txtpnMsgBurbuja.setBounds(57, 29, 187, 81);
		panelBurbuja.add(txtpnMsgBurbuja);

	}

	private void crearIngresarDatos() {

		PanelImagen panelJugador = new PanelImagen(
				"img/paneles/panelIngresar.png");
		panelJugador.setBounds(403, 74, 340, 400);
		// panelJugador.setBackground(fondoPanel.getImage());
		panelJugador.setPreferredSize(new Dimension(340, 400));
		panelJugador.setBorder(null);
		panelJugador.setLayout(null);
		add(panelJugador);

		JLabel lblNombre = new JLabel("Nombre:");
		lblNombre.setFont(new Font("Segoe Print", Font.BOLD, 14));
		lblNombre.setBounds(41, 158, 68, 17);
		panelJugador.add(lblNombre);
		lblNombre.setForeground(Color.DARK_GRAY);

		// Caja para ingresar el nombre
		txtNombre = new JTextField("");
		txtNombre.setSelectedTextColor(Color.YELLOW);
		txtNombre.setHorizontalAlignment(SwingConstants.CENTER);
		txtNombre.setSelectionColor(Color.DARK_GRAY);
		txtNombre.setBackground(new Color(255, 255, 204));
		txtNombre.setFont(new Font("Dialog", Font.BOLD, 12));
		txtNombre.setBounds(127, 155, 165, 23);
		txtNombre.selectAll();
		panelJugador.add(txtNombre);
		txtNombre.setColumns(10);

		JLabel lblModo = new JLabel("Modo:");
		lblModo.setFont(new Font("Segoe Print", Font.BOLD, 14));
		lblModo.setBounds(41, 193, 79, 17);
		panelJugador.add(lblModo);

		// Opciones de modo Facil/Dificil
		rdbtnFacil = new JRadioButton("Fácil");
		rdbtnFacil.setSelected(true);
		rdbtnFacil.setMnemonic(KeyEvent.VK_TAB);
		rdbtnFacil.setBackground(new Color(255, 255, 204));
		rdbtnFacil.setFont(new Font("Segoe Print", Font.BOLD, 14));
		rdbtnFacil.setOpaque(false);
		buttonGroup.add(rdbtnFacil);
		rdbtnFacil.setBounds(127, 193, 149, 23);
		panelJugador.add(rdbtnFacil);

		rdbtnDificil = new JRadioButton("Difícil");
		rdbtnDificil.setMnemonic(KeyEvent.VK_TAB);
		rdbtnDificil.setFont(new Font("Segoe Print", Font.BOLD, 14));
		rdbtnDificil.setOpaque(false);
		buttonGroup.add(rdbtnDificil);
		rdbtnDificil.setBounds(127, 220, 149, 23);
		panelJugador.add(rdbtnDificil);

		btnComenzar = new JButton("Comenzar");
		btnComenzar.setSelectedIcon(new ImageIcon(
				"img/paneles/botonComenzarPresionado.png"));
		btnComenzar.setPressedIcon(new ImageIcon(
				"img/paneles/botonComenzarPresionado.png"));
		btnComenzar.setIcon(new ImageIcon("img/paneles/botonComenzar.png"));
		btnComenzar.setContentAreaFilled(false);
		btnComenzar.setBorderPainted(false);
		btnComenzar.setBorder(null);
		btnComenzar.setForeground(Color.ORANGE);
		btnComenzar.setHorizontalTextPosition(SwingConstants.CENTER);
		btnComenzar.setIconTextGap(0);
		btnComenzar.setBounds(65, 260, 200, 80);
		panelJugador.add(btnComenzar);

		// Cuadro de mensajes indicativos sobre nombre y modo
		txtpnMensaje = new JTextPane();
		txtpnMensaje.setVerifyInputWhenFocusTarget(false);
		txtpnMensaje.setRequestFocusEnabled(false);
		StyledDocument doc = txtpnMensaje.getStyledDocument();
		SimpleAttributeSet center = new SimpleAttributeSet();
		StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
		doc.setParagraphAttributes(0, doc.getLength(), center, false);
		txtpnMensaje
				.setText("Si desea jugar ingrese aquí su nombre, seleccione el modo de dificultad y presione el boton comenzar.");
		txtpnMensaje.setBounds(41, 58, 251, 74);
		panelJugador.add(txtpnMensaje);
		txtpnMensaje.setForeground(Color.DARK_GRAY);
		txtpnMensaje.setCaretColor(Color.DARK_GRAY);
		txtpnMensaje.setFocusTraversalKeysEnabled(false);
		txtpnMensaje.setFocusCycleRoot(false);
		txtpnMensaje.setFocusable(false);
		txtpnMensaje.setEditable(false);
		txtpnMensaje.setFont(new Font("Segoe Print", Font.BOLD, 14));
		txtpnMensaje.setOpaque(false);

	}

	// Eventos propios del PanelInicio fuera del ControlCentral.
	private void eventosLocales() {

		// Evento al presionar ENTER dentro la caja del nombre.
		txtNombre.addKeyListener(new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {

				}
			}
		});

		txtNombre.addFocusListener(new FocusAdapter() {

			// Evento al pasar el focus a la caja del nombre.
			@Override
			public void focusGained(FocusEvent e) {
				panelBurbuja.setVisible(false);
				setMensaje("Escriba su nombre o apodo con el que quiera ser reconocido.");
			}

			// Evento al salir de la caja del nombre.
			@Override
			public void focusLost(FocusEvent e) {
				if (!nombreCorrecto()) {
					txtNombre.setCursor(Cursor.getDefaultCursor());
					setMensajeError("Hay caracteres incorrectos. Vuelva a escribir su nombre.");
				}
			}
		});

		txtNombre.addMouseListener(new MouseAdapter() {

			// Evento al hacer click en la caja del nombre.
			@Override
			public void mousePressed(MouseEvent e) {
				txtNombre.selectAll();
				panelBurbuja.setVisible(false);
				setMensaje("Escriba su nombre o apodo con el que quiera ser reconocido.");
			}
		});

		// Evento al seleccionar una opcion del modo.
		rdbtnFacil.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				setMensaje("Se le mostrará un numero limitado de opciones en que pensar.");
			}
		});
		rdbtnDificil.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				setMensaje("No hay limites de opciones. Podrá pensar en el animal que desee y lo tendré que adivinar.");
			}
		});
	}

	/** Comprueba que el nombre ingresado sea correcto **/
	private boolean nombreCorrecto() {
		String txt = txtNombre.getText();
		if (txt.isEmpty() || txt.contains("<")) {
			return false;
		}
		return true;
	}

	/** Asignar control de eventos. **/
	public void setActionListener(ControlCentral e) {
		btnComenzar.addActionListener(e);
	}

	/** Mensajes en rojo por ingreso de nombre incorrecto. **/
	public void setMensajeError(String mensaje) {
		txtpnMensaje.setForeground(new Color(255, 0, 0));
		txtpnMensaje.setText(mensaje);
	}

	/** Mensaje en verde de sugerencia. **/
	public void setMensaje(String mensaje) {
		txtpnMensaje.setForeground(new Color(0, 150, 0));
		txtpnMensaje.setText(mensaje);
	}

	public String getNombre() {
		return txtNombre.getText();
	}

	public modo getModo() {
		return (rdbtnFacil.isSelected()) ? modo.FACIL : modo.DIFICIL;
	}
}
